//package cn.handong.tool.spring_aop.异常重试;
//
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Method;
//import java.util.Arrays;
//import java.util.List;
//
///**
// * @author wzq
// * @desc 注意：由于无法区分client_token和user_token可能会导致无效的请求，但是为了保证程序的正确性，不得已而为之
// */
//@Aspect
//@Order(1)
//@Component
//public class AmClientTokenGetAspect {
//
//    public static final String TOKEN_INVALID = "401";
//
//    /**
//     * 需要处理的异常类
//     */
//    private static List<Object> processExceptions = Arrays.asList(
//            new AMException("statusCode", "subStatusCode", "message", null)
//    );
//
//    private static boolean isProcessException(Throwable e) {
//        boolean isException = processExceptions.stream().anyMatch(item -> e.getClass() == item.getClass());
//        if (!isException) {
//            return false;
//        }
//
//        try {
//            Method method = e.getClass().getDeclaredMethod("getStatusCode");
//            String statusCode = (String) method.invoke(e);
//            return TOKEN_INVALID.equals(statusCode);
//        } catch (Exception exception) {
//            return false;
//        }
//    }
//
//    @Around(value = " @annotation(cn.handong.tool.spring_aop.异常重试.AmClientTokenGet)")
//    public Object around(ProceedingJoinPoint pjp) throws Throwable {
//        try {
//            return pjp.proceed();
//        } catch (Throwable e) {
//            if (!isProcessException(e)) {
//                throw e;
//            }
//            int retryCount = 0;
//            while (true) {
//                try {
//                    FolServiceProxy.n ++;
//                    return pjp.proceed();
//                } catch (Throwable e1) {
//                    retryCount++;
//                    if (!isProcessException(e) || retryCount == 3) {
//                        throw e1;
//                    }
//                }
//            }
//        }
//    }
//}
